package com.lwl.Algorithmic_data_structure.class05快排;

import com.lwl.Utils.NumberUtils;
import com.lwl.Utils.PrintUtil;

/**
 * 给你一个数组,以及一个num,按这个num对数组进行区分,小于放左边,大于放右边,等于放中间
 */
public class Code01DistinguishByNum {

    public static void main(String[] args) {
        int[] arr = NumberUtils.createRandomArrayRepeat(10, 5);
        PrintUtil.printArray(arr);
        distinguishByNum(arr, 3);
        PrintUtil.printArray(arr);
    }

    public static void distinguishByNum(int[] arr, int num) {
        if (arr == null) {
            return;
        }
        int leftSide = -1;
        // 右边界在数组之外是为了遍历完所有内容,如果是在arr.length-1,就会少遍历一个数
        int rightSide = arr.length;
        int curIndex = 0;

        while (curIndex < rightSide) {
            System.out.println("curIndex : " + curIndex + ", left : " + leftSide + ", right : " + rightSide + "");

            if (arr[curIndex] < num) {
                NumberUtils.swap(arr, curIndex++, ++leftSide);
            } else if (arr[curIndex] == num) {
                curIndex++;
            } else {
                //此时遍历指针不移动,因为交换回来的数还没看过
                NumberUtils.swap(arr, curIndex, --rightSide);
            }
            System.out.println("===========");
            PrintUtil.printArray(arr);
        }
    }

}
